#include <iostream>
#include <cstdarg>

// 不定参宏函数
#define LOG(fmt,...) printf("[%s:%d]"#fmt"\n",__FILE__,__LINE__,##__VA_ARGS__)

// C语言中不定参函数的使用，不定参数据的访问
void Print(int count,...){
    va_list ap;
    va_start(ap,count);
    for(int i = 0;i < count;i++){
        int num = va_arg(ap,int);
        std::cout << num << " ";
    }
    va_end(ap);
}

// 在内容为空时，则进行特化，退出递归
void XPrint(){
    std::cout << std::endl;
}
template<typename T,typename ...Args>
void XPrint(const T& v, Args&& ...args){
    std::cout << v << " ";
    if(sizeof...(args) > 0){
        XPrint(std::forward<Args>(args)...);
    }
    else{
        XPrint();
    }
}

int main()
{
    // 不定参宏函数
    std::cout << "不定参宏函数：" << std::endl;
    LOG("%s","Cpp");
    std::cout << std::endl;

    // C语言中不定参函数的使用
    std::cout << "C语言中不定参函数的使用：" << std::endl;
    Print(4,2,22,23,25);
    std::cout << std::endl << std::endl;

    // C++中不定参数的使用
    std::cout << "C++中不定参数的使用：" << std::endl;
    XPrint(4,2,22,23,25);
    XPrint("111","222","3333");
    std::cout << std::endl;

    return 0;
}